package com.situ.mall.service.impl;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.aspectj.weaver.NewConstructorTypeMunger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.situ.mall.entity.Cart;
import com.situ.mall.entity.Order;
import com.situ.mall.entity.OrderItem;
import com.situ.mall.mapper.CartMapper;
import com.situ.mall.mapper.OrderItemMapper;
import com.situ.mall.mapper.OrderMapper;
import com.situ.mall.service.IOrderService;
import com.situ.mall.util.DateUtil;

@Service
public class OrderServiceImpl implements IOrderService{
	@Autowired
	private CartMapper cartMapper;
	@Autowired
	private OrderMapper orderMapper;
	@Autowired
	private OrderItemMapper orderItemMapper;

	@Override
	public boolean insert(Order order) {
		// 现在这个order里面有userId、shippingId、paymentType
		// orderNo:使用当前的日期和时间 20200402093523
		order.setOrderNo(DateUtil.getCurrentTime());
		// TODO 不应该写10魔法数字，后期使用枚举
		// 订单状态:0-已取消-10-未付款，20-已付款，40-已发货，50-交易成功，60-交易关闭
		order.setStatus(10);
		// 现在只差payment: payment decimal(20,2)实际付款金额,单位是元,保留两位小数
		// 这个订单的实际付款金额需要遍历所有的订单项order_item
		
		//double payment = 0.0;
		// BigDecimal payment = new BigDecimal("0.0");
		BigDecimal payment = BigDecimal.valueOf(0.0);
		// 当前用户购物车里面勾选了checked=1要结算的购物车列表
		List<Cart> cartList = cartMapper.selectByUserIdAndChecked(order.getUserId());
		for (Cart cart : cartList) {
			OrderItem orderItem = new OrderItem();
			orderItem.setUserId(order.getUserId());
			orderItem.setOrderNo(order.getOrderNo());
			orderItem.setProductId(cart.getProductId());
			orderItem.setProductName(cart.getProduct().getName());// 快照
			orderItem.setProductImage(cart.getProduct().getMainImage());// 快照
			orderItem.setCurrentUnitPrice(cart.getProduct().getPrice());// 快照
			orderItem.setQuantity(cart.getQuantity());
			// total_price decimal(20,2)商品总价,单位是元,保留两位小数
			// 这个字段冗余，是多余的，完全可以通过单价*数量，但是如果经常用到这个字段
			// 每次去计算就非常麻烦，所以可以适当加冗余字段，方便操作
			// The operator * is undefined for the argument type(s) BigDecimal, Integer
			// double totalPrice = cart.getProduct().getPrice().doubleValue() * cart.getQuantity();
			BigDecimal productPrice = cart.getProduct().getPrice();
			BigDecimal totalPrice  = productPrice.multiply(BigDecimal.valueOf(cart.getQuantity()));
			orderItem.setTotalPrice(totalPrice);
			
			payment = payment.add(totalPrice);
			
			orderItemMapper.insert(orderItem);
		}
		
		order.setPayment(payment);
		int count = orderMapper.insert(order);
		
		// TODO: 订单生成完之后，应该去购物车表里面把已经生成订单的数据删除掉
		
		return count == 1 ? true : false;
	}
	
	public static void main(String[] args) {
		String str1 = "hello";
		String str2 = "he" + new String("llo"); 
		String str3 = "he" + "llo"; //去常量池
		System.err.println(str1== str2); 
		System.err.println(str1 == str3);
	}
}
